그래픽스 객체

MATLAB에서 그린 그래프들은 여러가지 그래픽스 객체들이 하나의 figure 안에 합쳐져 형성된 것이다. 예를 들어, 아래의 스크립트를 이용해 그래프를 하나 그려보자.

close all;
t = linspace(0, 0.3, 1000);
y = chirp(t, 0,1,250);
f = figure;
h1 = plot(t, y, 'linewidth',2);
hold on;
h2 = plot(t, sin(2* pi* 2.5 * t), 'linewidth', 2);
xlabel('x-axis'); ylabel('y-axis');
lgd = legend('chirp', 'sine');


위 그림에서 보이는 결과물들은 아래와 같이 여러가지 그래픽스 객체의 결합으로 구성되어 있다.


명령창(Command Window)에 “f”라고 치면 Figure 객체가 갖는 특성들을 확인할 수 있다.


이렇듯 변수 “f”는 Figure 객체의 특성에 접근할 수 있게 해주는 변수라는 것을 알 수 있다. 이런 변수들을 특별히 “핸들(handles)”이라고 부른다. 자동차 핸들을 이용해 자동차의 움직임을 조작할 수 있는 것 처럼 “그래픽스 객체 핸들”을 통해 “그래픽스 객체”들을 조작할 수 있게 해준다. 우리는 스크립트를 이용해 그래프를 그릴 때 그래픽스 객체 핸들을 “f”, “h1” 등의 변수로 받도록 명령한 것이다.

그래픽스 객체 수정하기

만약 “f”가 가리키는 Figure 객체의 특성을 수정하고 싶다면 점 표기법을 이용해 아래와 같이 그래픽스 객체 핸들에 접근해 특성을 수정할 수 있다.

f.Name = 'foo';


또, “h2”가 가리키는 Line 객체의 색깔을 수정하는 것도 가능할 것이다.

h2.Color = 'green';


만약, 명령창에서 접근하는 방법이 어렵다면, Figure의 Property Inspector 버튼을 누른 다음 수정하고자 하는 그래픽스 객체를 선택해보자.


이 방법을 이용하면 우측에 뜨는 “Property Inspector”의 값을 수정함으로써 그래픽스 객체의 특성을 수정할 수 있다.

그래픽스 객체 찾기

그래픽스 객체의 핸들을 생성하기 위해선 처음의 예제에서 처럼 그래픽스 객체 생성 시 출력값으로 핸들로 사용할 변수를 집어넣으면 됐다. 다시 한번 예를 들자면 “plot” 함수를 이용하는 경우에는 아래와 같이 “h”라는 출력값을 지정하고 “h”를 “plot”에 대한 그래픽스 객체 핸들로 사용할 수 있었다.

h = plot(x, y);

그런데, 만약 이처럼 핸들로 사용할 변수를 미리 지정하지 않았을 때는 어떻게 하면 좋을까? 이럴 때는 “findobj”라는 함수를 이용해 이미 띄워져 있는 그래픽스 객체들을 찾을 수 있다. 아래의 예를 살펴보자.

close all;
t = linspace(0, 0.3, 1000);
y = chirp(t, 0,1,250);
figure;
plot(t, y, 'linewidth',2);
hold on;
plot(t, sin(2* pi* 2.5 * t), 'linewidth', 2);
xlabel('x-axis'); ylabel('y-axis');
legend('chirp', 'sine');


여기서 “findobj” 함수를 이용하면

h = findobj

아래와 같이 현재 띄워져 있는 그래픽스 객체들을 모두 포함된 배열을 생성해준다.

h = 

  6×1 graphics array:

  Root
  Figure    (1)
  Legend    (chirp, sine)
  Axes
  Line      (sine)
  Line      (chirp)

만약 여기서 “chirp”에 해당하는 Line 객체를 수정하고 싶다면 h(6)에 대고 수정해줄 수 있다. 가령 아래와 같이 라인 스타일을 수정해줄 수도 있다.

h(6).LineStyle  = '--';


“findobj”를 이용하면 특정 속상값을 가진 객체만을 골라서 찾을 수도 있다. 예를 들면, “Line” 타입의 그래픽스 객체이면서 LineStyle은 “–“인 그래픽스 객체를 찾으려면 아래와 같이 수행할 수 있다.

h2 = findobj('Type', 'Line', 'LineStyle', '--')

앞선 설명을 통해 “chirp” 라는 Line의 LineStyle을 점선으로 바꾸었다면 아래와 같은 결과를 얻을 수 있을 것이다.

h2 = 

  Line (chirp) with properties:

              Color: [0 0.4470 0.7410]
          LineStyle: '--'
          LineWidth: 2
             Marker: 'none'
         MarkerSize: 6
    MarkerFaceColor: 'none'
              XData: [0 3.0030e-04 6.0060e-04 9.0090e-04 0.0012 0.0015 0.0018 … ]
              YData: [1 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 … ]

  Show all properties

또 아주 가끔 사용되긴 하지만 “findobj”를 이용하면 그래픽스 객체의 속성값을 수정하지 않고도 legend 내부에서 표현되는 그래픽스 객체의 속성값만 수정할 수 있다.


close all;
t = linspace(0, 1, 30);
x1 = sin(2*pi*1*t);
x2 = sin(2*pi*1*t - 0.5);

plot(t, x1);
hold on;
plot(t, x2);
[~, icons] = legend('Sine 1', 'Sine 2');
icons = findobj(icons, 'Type', 'line', 'LineStyle', '-')
set(icons, 'LineWidth', 3)